package com.wjw.java.basic.array_;

/**
 * 二维数组:内存图见array_two_dimensional.png
 * ----------------------------------------------------------
 * 语法：数据类型[][] 数组名 = new 数据类型[大小][大小],如:
 * int [][] array = new int [2][3];
 * 意思是创建了一个二维数组,二维数组中有2个元素
 * 每一个元素都是一个一维数组,每一个一维数组中都有3个元素
 */
public class ArrayTwoDimensional {
    public static void main(String[] args) {
        TwoDimensionalArrayInit();
        System.out.println("------------------------------------------------------");
        TwoDimensionalArrayUse1();
        TwoDimensionalArrayUse2();
        YangHuiTriangle();
    }

    /**
     * 1.二维数组的定义与遍历
     */
    public static void TwoDimensionalArrayInit(){
        /**
         * 使用二维数组输出：
         * 0 0 0 0 0 0
         * 0 0 1 0 0 0
         * 0 2 0 3 0 0
         * 0 0 0 0 0 0
         * ---------------------------------------
         * 1.从定义形式上看：int [][]
         * 2.二维数组中的每一个元素都是一个一维数组
         * ---------------------------------------
         */
        int [][] twoArray = {{0,0,0,0,0,0},{0,0,1,0,0,0},{0,2,0,3,0,0},{0,0,0,0,0,0}};
        //遍历二维数组
        for (int i = 0; i < twoArray.length; i++) {
            //获取二维数组中的每一个元素(每一个元素都是一个以为数组)
            int[] oneArray = twoArray[i];
            //遍历一维数组
            for (int j = 0; j < oneArray.length; j++) {
                System.out.print(twoArray[i][j]+"\t");
            }
            System.out.println();//换行
        }
    }

    /**
     * 2.使用二维数组打印
     * 1
     * 2 2
     * 3 3 3
     */
    public static void TwoDimensionalArrayUse1(){
        //创建一个二维数组,数组中有三个元素,
        //每个元素都是一个一维数组,但是每个一维数组中的元素个数不确定
        int [][] arr = new int[3][];
        for (int i = 0; i < arr.length; i++) {
            /**
             * 给每一个一维数组开辟空间
             * i=0时,一维数组中有1个元素
             * i=1时,一维数组中有2个元素
             * i=2时,一维数组中有3个元素
             */
            arr[i] = new int[i+1];
            /**
             * 给每一个一维数组中的每一个元素赋值
             */
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j] = i+1;
            }
        }

        //循环遍历二维数组
        for (int i = 0; i < arr.length; i++) {
            int[] ints = arr[i];
            for (int j = 0; j < ints.length; j++) {
                System.out.print(arr[i][j] +"\t");
            }
            System.out.println();
        }
    }

    /**
     * 遍历二维数组求和
     */
    public static void TwoDimensionalArrayUse2(){
        int [][] arr = {{1,2,3},{10,20,30},{-1,-2,-3}};
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            //获取二维数组中的每一个元素
            int[] ints = arr[i];
            //遍历一维数组
            for (int j = 0; j < ints.length; j++) {
                sum += arr[i][j];
            }
        }
        System.out.println("和为："+sum);
    }

    /**
     * 杨辉三角：
     * 使用二维数组打印一个10行的杨辉三角
     * 1
     * 1    1
     * 1    2   1
     * 1    3   3   1
     * 1    4   6   4   1
     * 1    5   10  10  5   1
     * ...
     *
     * 规律：
     * 1.第一行有1个元素,第n行有n个元素
     * 2.每一行的第一个元素和最后一个元素都为1
     * 3.从第三行开始,对于非第一个元素和非最后一个元素的值:arr[i][j]
     * arr[i][j] = arr[i-1][j] + arr[i-1][j-1]
     */
    public static void YangHuiTriangle(){
        int [][] arr = new int[10][];
        for (int i = 0; i < arr.length; i++) {
            //给每个一维数组开辟内存
            arr[i] = new int[i+1];

            for (int j = 0; j < arr[i].length; j++) {
               if(j == 0 || j == arr[i].length -1){//首位的元素
                   arr[i][j] = 1;
               }else {//中间的元素
                   arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
               }
            }
        }

        //循环遍历二维数组
        for (int i = 0; i < arr.length; i++) {
            int[] ints = arr[i];
            for (int j = 0; j < ints.length; j++) {
                System.out.print(arr[i][j] +"\t");
            }
            System.out.println();
        }
    }
}
